package com.fl.iocaop.java8.Teststream;

import com.fl.iocaop.java8.apple;
import org.junit.Test;

import java.util.*;
import java.util.function.Supplier;
import java.util.stream.Collectors;
import java.util.stream.Stream;

/**
 * stream流创建的3个步骤
 * 1.创建流
 * 2.中间操作
 * 3.终止流
 */
public class TestStreamApI2 {
    private static List<apple> apples = new ArrayList<>();
    //为apple集合注入值
    static {
        apples.add(new apple("黄色",50, apple.status.FREE));
        apples.add(new apple("绿色",60,apple.status.FREE));
        apples.add(new apple("嘿色",60,apple.status.SUCCESSF));
        apples.add(new apple("红色",85,apple.status.SUCCESSF));
        apples.add(new apple("红色",85,apple.status.SUCCESSF));
        apples.add(new apple("童话色",85,apple.status.SUCCESSF));
        apples.add(new apple("白色",100,apple.status.FULL));
        apples.add(new apple("蓝色",100,apple.status.FULL));
    }
    /**
     * 筛选与切片
     * filter——接收Lambda ,从流中排除某些元素。
     * limit——戴断流，使其元素不超过给定数量。
     * skip(n)—跳过元素，返回一个扔掉了前n 个元素的流。若流中元素不足n 个，则返回一个空渣。与limit(n)互补.
     * distinct—筛选，通过流所生成元素的 hashCode()和equals()去除重复元素.
     */
    @Test
    public void test(){
        List<apple> collect = apples.stream()
                .filter(x -> x.getWeight() > 50)
                .collect(Collectors.toList());
        //java8排序
        collect.sort(Comparator.comparing(apple::getColor).reversed());
        collect.forEach(System.out::println);
    }
    //筛选重量大于50，并且跳过前两条数据，去重复
//    @Test
    public static Stream<apple> test2(){
        Stream<apple> stream = apples.stream()
                .filter(x -> x.getWeight() > 50)
                .skip(2)
                .distinct();
        return stream;

    }
    /**
     * 映射
     * map—接收Lambda ，将元素转换成其他形式或提取信息。接收一个函数作为参数，该函数会被应用到每个元素上，并将其映射成一个新的元素。
     * flatMap—接收一个函数作为参数，将流中的每个值都换成另一个流，然后把所有流连接成一个流
     */
    @Test
    public void test3(){
        List<String> list = Arrays.asList("aaa", "asdasd", "aasjd ");
        list.stream()
                .map(str->str.toUpperCase(Locale.ROOT))
                .collect(Collectors.toList());
//  获取apples集合中的苹果颜色
//        apples.stream().map(str->str.getColor()).forEach(System.out::println);
        apples.stream().collect(
                Collectors.groupingBy(str->str.getColor(),Collectors.averagingInt(str->str.getWeight())))
                .forEach((k,v)-> System.out.println("颜色:"+k+"--平均重量:"+v));

    }

    /**
     * 将apples集合暴露
     */
    public static List<apple> methodTest(){
        return apples;
    }
}
